package com.turing.data.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * function:sql生成工具
 * 用于生成SQL语句
 *
 **/
public class CreateSqlUtil {

//    public static void main(String[] args) {
//        final String templateId = "11";
//        int eleStartId = 30629;
//        String eleNames = "比例范围\n" +"运作方式1\n" +"是否为MOM/FOF产品\n" +"是否涉及境外投资\n" +"合同规定的主要投资范围及投资组合比例\n" +"单个投资者最低认购金额\n" +"是否按要求说明\n" +"最低成立规模\n" +"最低投资者数量\n" +"是否订明资产管理计划成立前，任何机构和个人不得动用投资者参与资金\n" +"资产管理计划成立后备案完成前，是否开展以下投资活动\n" +"运作方式2\n" +"封闭期\n" +"开放频率\n" +"是否设置临时开放期\n" +"临时开放期解释说明\n" +"运作期是否允许份额转让\n" +"是否设立持有人大会\n" +"存续期\n" +"是否有业绩比较基准\n" +"预警线\n" +"预警线数额\n" +"投资杠杆率上限（总资产/净资产）\n" +"建仓期\n" +"资产管理计划的估值方法\n" +"是否使用摊余成本法\n" +"管理费\n" +"托管费\n" +"收益分配次数内容填写\n" +"合同变更方式\n" +"合同终止情形/附加情形\n" +"调解方式\n" +"合同生效附加条件\n" +"其他事项内容\n" +"是否聘请投资顾问\n" +"托管人名称(全称)\n" +"经办人信息\n" +"经办人电话\n" +"投资经理或投资决策人信息\n" +"产品名称（全称）\n" +"产品简称\n" +"FOF/MOM产品\n" +"是否允许追加\n" +"最低托管费金额\n" +"业绩报酬提取间隔是否大于六个月\n" +"平仓线/止损线控制指标\n" +"投资顾问业绩报酬提取间隔是否大于六个月\n" +"预警线控制指标\n" +"是否需进行特别风险揭示\n" +"资产管理类型\n" +"合同签署日\n" +"合同生效条件\n" +"是否新增投顾\n" +"投顾是否为管理人关联方\n" +"风险承担方式\n" +"产品特有风险\n" +"管理费支付频率\n" +"管理费计提有效天数\n" +"管理费特殊需求\n" +"业绩报酬计提比例\n" +"业绩报酬支付指令要求\n" +"浮动管理费特殊需求\n" +"托管费计提有效天数\n" +"不同考核周期的业绩报酬提取比例是否相同\n" +"不同考核周期的业绩报酬计提起点是否相同\n" +"是否在某个固定时点进行业绩考核\n" +"浮动投顾费特殊需求\n" +"管理费收款账户名\n" +"管理费收款账号\n" +"管理费收款账户开户行\n" +"管理费收款账户开户行大额支付号\n" +"托管费收款账户开户行大额支付号\n" +"委托人收款账户开户行\n" +"投顾费账户开户行\n" +"投顾费账户名\n" +"投顾费账户号\n" +"投顾名称_备注\n" +"投顾费特殊需求\n" +"托管人名称_备注\n" +"最低管理费金额\n" +"风险准备金要求\n" +"追加认购单笔最低限额（集合特有）\n" +"信息披露需求内容_其他\n" +"产品风险等级\n" +"单位净值精度\n" +"估值频率\n" +"管理费计提基数\n" +"合同生效条件_其他\n" +"是否接受违约退出（集合特有）\n" +"是否允许提取\n" +"收益分配条件\n" +"首次认购单笔最低限额（集合特有）\n" +"首次申购单笔最低限额（集合特有）\n" +"提取限额\n" +"投顾1主要联系人办公电话\n" +"投顾1主要联系人姓名\n" +"投顾费计提有效天数\n" +"投顾费账户开户行大额支付号\n" +"投顾名称\n" +"投顾名称2\n" +"托管费收款账号\n" +"托管费收款账户开户行\n" +"托管费收款账户名\n" +"托管费支付频率\n" +"托管人名称\n" +"委托人联系人（单一特有）\n" +"委托人联系人手机号码（单一特有）\n" +"委托人名称（单一特有）\n" +"委托人收款账号\n" +"委托人收款账户开户行大额支付号（单一特有）\n" +"委托人收款账户名\n" +"信息披露需求内容\n" +"业绩报酬考核基准_备注\n" +"业绩比较基准\n" +"业绩比较基准描述\n" +"追加申购单笔最低限额（集合特有）\n" +"产品类别\n" +"份额结构类型（集合特有）\n" +"份额类型（集合特有）\n" +"管理费计算方式\n" +"合同成立条件\n" +"巨额赎回（集合特有）\n" +"开放方式（集合特有）\n" +"开放期规则（集合特有）\n" +"平仓线/止损线\n" +"实际客户名称（单一特有）\n" +"是否分级（集合特有）\n" +"是否有浮动投顾费\n" +"收益分配方式\n" +"特殊风控要求\n" +"投顾2主要联系人办公电话\n" +"投顾2主要联系人姓名\n" +"投顾费计提基数\n" +"投顾费率\n" +"投顾费支付频率\n" +"投顾权利及义务\n" +"投资限制\n" +"托管费计提基数\n" +"委托人性质（单一特有）\n" +"业绩报酬计算公式\n" +"业绩报酬考核基准\n" +"业绩报酬考核周期\n" +"业绩报酬考核周期_其他\n" +"业绩报酬支付时点\n" +"业绩比较基准测算依据及过程\n" +"产品估值方法描述\n" +"平仓线/止损线控制指标_其他\n" +"预警线控制指标_其他\n" +"调解方式_其他\n" +"每季开放频率\n" +"产品估值方法";
//        String mapNames = "Range\n" +"OperateMethod1\n" +"IfMomFof\n" +"IfOutlands\n" +"ScopeOfInvestment\n" +"MinSubscribe\n" +"IfRequirement\n" +"AssetSetupRequirement\n" +"AssetSetupRequirement\n" +"IfBeforeAllNotAvailable\n" +"AfterIfAvailable\n" +"OperateMethod2\n" +"ClosedPeriod\n" +"OpenFrequency\n" +"IfTemporaryOpenFrequency\n" +"TemporaryOpenFrequencyExplaination\n" +"IfShareTransfer\n" +"IfSetupHolders\n" +"Duration\n" +"IfPerformanceBenchmark\n" +"WarningLine\n" +"WarningLineNumber\n" +"UpperLimitOfInvestmentLeverageRatio\n" +"WarehouseBuildingPeriod\n" +"ValuationMethod\n" +"IfAmortizedCostMethod\n" +"ManagementCosts\n" +"CustodyFee\n" +"TimesOfIncomeDistribution\n" +"ChangeOfContract\n" +"TerminationOfContract\n" +"ControlMode\n" +"EffectivenessOfContract\n" +"OtherrMatters\n" +"IfInvestmentConsultant\n" +"Trustee\n" +"OperatorInformation\n" +"OperatorTele\n" +"InvestmentManager\n" +"ProductFullName\n" +"ProductShortName\n" +"FOFMOM\n" +"IsAllowAdd\n" +"MinimumEscrowFeeAmount\n" +"PerformanceRemunerationAssessmentCycleOther\n" +"ClosingLineStopLossLineControlIndex\n" +"InvestmentCounselorPerformanceExtract\n" +"EarlyWarningLineControlIndex\n" +"EspeciallyRiskReveal\n" +"ManagementType\n" +"ContractSignDay\n" +"TakeeffectCondition\n" +"UpInvestmentAdviser\n" +"AdviserRelevance\n" +"RiskAssumeWay\n" +"ProductRisk\n" +"ManagementPayFrequency\n" +"ManagementFeeEffectiveNumberDays\n" +"ManagementCostSpecial\n" +"AccrualProportionOfPerformanceRemuneration\n" +"PerformancePayInstructionRequirements\n" +"SpecialRequirementsForFloatingManagementFee\n" +"EffectiveDaysOfEscrowFeeAccrual\n" +"DifferentAssessmentPeriodsTheSame\n" +"TheSameInDifferentAssessmentCycles\n" +"WhetherToConductPerformanceAppraisalAtaFixedTimePoint\n" +"SpecialRequirementsForFloatingInvestmentAdvisoryFees\n" +"ManagementFeeCollectionAccountName\n" +"ManagerFeeAccount\n" +"manageReceiptAccountBank\n" +"ManagerFeeLargePaymentAccount\n" +"InvestmentFeeLargePaymentAccount\n" +"ClientAccountOpenBank\n" +"InvestmentOpenBank\n" +"InvestmentAdvisoryFeeAccountName\n" +"investmentAdviserAccount\n" +"InvestmentAdviserRemark\n" +"SpecialRequirementsForInvestmentAdvisoryFees\n" +"TrusteeRemark\n" +"MinManagementCost\n" +"RiskReserveRequirements\n" +"MinimumAmountOfAdditionalSubscription\n" +"MessageDemandElse\n" +"ProductRiskRanking\n" +"NetWorthAccuracyOfUnit\n" +"ValuationFrequency\n" +"AdministrativeExpensesOfBase\n" +"ConditionForContractEffectiveness\n" +"IsAcceptBreachOfContract\n" +"IsAllowExtract\n" +"ConditionofIncomeDistribution\n" +"InitialSubscription\n" +"InitialSubscribe\n" +"LimitAmout\n" +"ManagerOfficeTelephone\n" +"ManagerName\n" +"AdvisoryFeeAccrualEffectiveDays\n" +"InvestmentWholesalePay\n" +"InvestmentAdviserName\n" +"InvestmentAdviserName2\n" +"InvestmentFeeAccountNumber\n" +"InvestmentFeeAccountBank\n" +"InvestmentFeeAccountName\n" +"InvestmentFeePaymentFrequency\n" +"TrusteeShipPerson\n" +"ContactPerson\n" +"ContactPersonPhone\n" +"ContactPersonName\n" +"ProceedsAccount\n" +"WholesalePay\n" +"ProceedsName\n" +"MessageDemand\n" +"AssessStandard\n" +"CompareStandard\n" +"StandardDescribe\n" +"SubscribeMinQuota\n" +"ProductType\n" +"ShareStructureType\n" +"ShareType\n" +"RegulateCalculateWay\n" +"ContractEstablish\n" +"BigMoneyBuyGoBack\n" +"OpenWay\n" +"OpenSeason\n" +"StopLossString\n" +"RealityClientName\n" +"WhetherClassification\n" +"WhetherHaveInvestment\n" +"EarningsAllot\n" +"SpecialWindRequire\n" +"InvestmentWorkPhone\n" +"InvestmentWorkName\n" +"InvestmentProvisionCardinal\n" +"InvestCastRate\n" +"InvestCastPayRate\n" +"InvestRightsAndDuties\n" +"InvestRestrict\n" +"ManageCashOfBase\n" +"ClientNature\n" +"RemunCaculaFormula\n" +"RemunAssessOfBase\n" +"RemunAssessOfCycle\n" +"RemunAssessOfCycleOther\n" +"RemunPayTime\n" +"AchieveBasisAndProcess\n" +"ProductWayDescribe\n" +"ControllerIndex\n" +"WarningLineContro\n" +"MediationModeOther\n" +"OpenFrequencyTwo\n" +"ProductMethod";
//        String sql = createElement(templateId , eleStartId , eleNames , mapNames);
//        System.out.println(sql);
//        System.out.println("总数量:"+sql.split("\n").length);
//    }

    /**
     * 生成 element 表
     *
     * INSERT INTO `element`
     * (`id`, `parent_ele_id`, `template_id`, `category`, `map_name`, `name`, `type`, `counted`, `package_sn`, `selected`, `is_del`, `created_time`, `updated_time`, `multiple`)
     * VALUES
     * (30491,0,'10', 1 , 'ProductMethod', '产品估值方法','多项',1, '55', 1, 0, NULL, NULL, '多项');
     *
     **/
    private static String createElement(String templateId , int eleStartId , String eleNames , String mapNames){
        String[] eleNameArray = eleNames.split("\n");
        String[] mapNameArray = mapNames.split("\n");
        StringBuilder sb = new StringBuilder();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(new Date());

        for(int i = 0 ; i < eleNameArray.length * 2; i++){
            int k = i / 2;
            sb.append("INSERT INTO `element`(`id`, `parent_ele_id`, `template_id`, `category`, `map_name`, `name`, `type`, `counted`, `package_sn`, `selected`, `is_del`, `created_time`, `updated_time`, `multiple`) VALUES (");
            sb.append(i + eleStartId);
            sb.append(",0,'");
            sb.append(templateId);
            sb.append("', 0 , '");
            sb.append(mapNameArray[k]);
            sb.append("', '");
            sb.append(eleNameArray[k]);
            sb.append("','多项',");
            sb.append("1 , '55' , 1 , 0 , '");
            sb.append(time);
            sb.append("' , NULL, '多项');");
            sb.append("\n");

            i++;

            sb.append("INSERT INTO `element`(`id`, `parent_ele_id`, `template_id`, `category`, `map_name`, `name`, `type`, `counted`, `package_sn`, `selected`, `is_del`, `created_time`, `updated_time`, `multiple`) VALUES (");
            sb.append(i + eleStartId);
            sb.append(",0,'");
            sb.append(templateId);
            sb.append("', 1 , '");
            sb.append(mapNameArray[k]);
            sb.append("', '");
            sb.append(eleNameArray[k]);
            sb.append("','多项',");
            sb.append("1 , '55' , 1 , 0 , '");
            sb.append(time);
            sb.append("' , NULL, '多项');");
            sb.append("\n");
        }

        return sb.toString();
    }


//    public static void main(String[] args) {
//        //id字段起始号
//        int startId = 373;
//        int startElementId = 30629;
//        //总条数
//        int count = 302;
//        String sql = createBusModelEleRelation(startId ,startElementId , count);
//        System.out.println(sql);
//        System.out.println("总数量:"+sql.split("\n").length);
//    }

    /**
     * 生成 busi_model_ele_relation 表
     *
     * INSERT INTO `busi_model_ele_relation`
     * (`id`, `model_ele_id`, `ele_id`, `created_time`, `updated_time`, `is_del`) VALUES
     * ( 312,30505,30506,'2022-06-16 17:18:04',NULL, 0);
     *
    **/
    private static String createBusModelEleRelation(int startId , int startElementId , int count){
        StringBuilder sb = new StringBuilder();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(new Date());

        for(int i = 0 ; i < count ; i += 2){
            sb.append("INSERT INTO `busi_model_ele_relation` (`id`, `model_ele_id`, `ele_id`, `created_time`, `updated_time`, `is_del`) VALUES ( ");
            sb.append(startId);
            sb.append(",");
            sb.append(i + startElementId);
            sb.append(",");
            sb.append(i + startElementId + 1);
            sb.append(",");
            sb.append("'" + time + "'");
            sb.append(",NULL, 0);");
            sb.append("\n");
            startId++;
        }

        return sb.toString();
    }


    public static void main(String[] args) {
        int idStart = 321;
        //起始的要素号
        int elementStartId = 30629;
        //默认从1开始计数
        int noStart = 1;
        String templateId = "11";
        String elementNames = "比例范围\n" +"运作方式1\n" +"是否为MOM/FOF产品\n" +"是否涉及境外投资\n" +"合同规定的主要投资范围及投资组合比例\n" +"单个投资者最低认购金额\n" +"是否按要求说明\n" +"最低成立规模\n" +"最低投资者数量\n" +"是否订明资产管理计划成立前，任何机构和个人不得动用投资者参与资金\n" +"资产管理计划成立后备案完成前，是否开展以下投资活动\n" +"运作方式2\n" +"封闭期\n" +"开放频率\n" +"是否设置临时开放期\n" +"临时开放期解释说明\n" +"运作期是否允许份额转让\n" +"是否设立持有人大会\n" +"存续期\n" +"是否有业绩比较基准\n" +"预警线\n" +"预警线数额\n" +"投资杠杆率上限（总资产/净资产）\n" +"建仓期\n" +"资产管理计划的估值方法\n" +"是否使用摊余成本法\n" +"管理费\n" +"托管费\n" +"收益分配次数内容填写\n" +"合同变更方式\n" +"合同终止情形/附加情形\n" +"调解方式\n" +"合同生效附加条件\n" +"其他事项内容\n" +"是否聘请投资顾问\n" +"托管人名称(全称)\n" +"经办人信息\n" +"经办人电话\n" +"投资经理或投资决策人信息\n" +"产品名称（全称）\n" +"产品简称\n" +"FOF/MOM产品\n" +"是否允许追加\n" +"最低托管费金额\n" +"业绩报酬提取间隔是否大于六个月\n" +"平仓线/止损线控制指标\n" +"投资顾问业绩报酬提取间隔是否大于六个月\n" +"预警线控制指标\n" +"是否需进行特别风险揭示\n" +"资产管理类型\n" +"合同签署日\n" +"合同生效条件\n" +"是否新增投顾\n" +"投顾是否为管理人关联方\n" +"风险承担方式\n" +"产品特有风险\n" +"管理费支付频率\n" +"管理费计提有效天数\n" +"管理费特殊需求\n" +"业绩报酬计提比例\n" +"业绩报酬支付指令要求\n" +"浮动管理费特殊需求\n" +"托管费计提有效天数\n" +"不同考核周期的业绩报酬提取比例是否相同\n" +"不同考核周期的业绩报酬计提起点是否相同\n" +"是否在某个固定时点进行业绩考核\n" +"浮动投顾费特殊需求\n" +"管理费收款账户名\n" +"管理费收款账号\n" +"管理费收款账户开户行\n" +"管理费收款账户开户行大额支付号\n" +"托管费收款账户开户行大额支付号\n" +"委托人收款账户开户行\n" +"投顾费账户开户行\n" +"投顾费账户名\n" +"投顾费账户号\n" +"投顾名称_备注\n" +"投顾费特殊需求\n" +"托管人名称_备注\n" +"最低管理费金额\n" +"风险准备金要求\n" +"追加认购单笔最低限额（集合特有）\n" +"信息披露需求内容_其他\n" +"产品风险等级\n" +"单位净值精度\n" +"估值频率\n" +"管理费计提基数\n" +"合同生效条件_其他\n" +"是否接受违约退出（集合特有）\n" +"是否允许提取\n" +"收益分配条件\n" +"首次认购单笔最低限额（集合特有）\n" +"首次申购单笔最低限额（集合特有）\n" +"提取限额\n" +"投顾1主要联系人办公电话\n" +"投顾1主要联系人姓名\n" +"投顾费计提有效天数\n" +"投顾费账户开户行大额支付号\n" +"投顾名称\n" +"投顾名称2\n" +"托管费收款账号\n" +"托管费收款账户开户行\n" +"托管费收款账户名\n" +"托管费支付频率\n" +"托管人名称\n" +"委托人联系人（单一特有）\n" +"委托人联系人手机号码（单一特有）\n" +"委托人名称（单一特有）\n" +"委托人收款账号\n" +"委托人收款账户开户行大额支付号（单一特有）\n" +"委托人收款账户名\n" +"信息披露需求内容\n" +"业绩报酬考核基准_备注\n" +"业绩比较基准\n" +"业绩比较基准描述\n" +"追加申购单笔最低限额（集合特有）\n" +"产品类别\n" +"份额结构类型（集合特有）\n" +"份额类型（集合特有）\n" +"管理费计算方式\n" +"合同成立条件\n" +"巨额赎回（集合特有）\n" +"开放方式（集合特有）\n" +"开放期规则（集合特有）\n" +"平仓线/止损线\n" +"实际客户名称（单一特有）\n" +"是否分级（集合特有）\n" +"是否有浮动投顾费\n" +"收益分配方式\n" +"特殊风控要求\n" +"投顾2主要联系人办公电话\n" +"投顾2主要联系人姓名\n" +"投顾费计提基数\n" +"投顾费率\n" +"投顾费支付频率\n" +"投顾权利及义务\n" +"投资限制\n" +"托管费计提基数\n" +"委托人性质（单一特有）\n" +"业绩报酬计算公式\n" +"业绩报酬考核基准\n" +"业绩报酬考核周期\n" +"业绩报酬考核周期_其他\n" +"业绩报酬支付时点\n" +"业绩比较基准测算依据及过程\n" +"产品估值方法描述\n" +"平仓线/止损线控制指标_其他\n" +"预警线控制指标_其他\n" +"调解方式_其他\n" +"每季开放频率\n" +"产品估值方法";
        String sql = createElementGroup(idStart , elementStartId , noStart , elementNames , templateId);
        System.out.println(sql);
        System.out.println("总数量:"+sql.split("\n").length);
    }

    /**
     * 生成 element_group 表
     *
     * INSERT INTO `element_group`
     * (`id`,`name`, `type`, `template_id`, `ele_ids`, `ele_names`, `bind_ele_type`, `is_del`, `created_by`, `created_time`, `updated_by`, `updated_time`, `no`) VALUES
     * (260,NULL,'single', '65C768EC', '30506','投资者名称',NULL, 0, NULL, '2022-06-16 17:46:36' , NULL, NULL,1);
     *
     **/
    private static String createElementGroup(int idStart , int elementStartId , int noStart , String elementNames , String templateId ){
        String[] eleNameArray = elementNames.split("\n");
        StringBuilder sb = new StringBuilder();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(new Date());

        int index = 1;
        for(int i = 0 ; i < eleNameArray.length ; i++){
            sb.append("INSERT INTO `element_group`(`id`,`name`, `type`, `template_id`, `ele_ids`, `ele_names`, `bind_ele_type`, `is_del`, `created_by`, `created_time`, `updated_by`, `updated_time`, `no`) VALUES (");
            sb.append(i + idStart);
            sb.append(",NULL,'single', '");
            sb.append(templateId);
            sb.append("', '");
            sb.append(elementStartId + index);
            sb.append("','");
            sb.append(eleNameArray[i]);
            sb.append("',NULL, 0, NULL, '");
            sb.append(time);
            sb.append("' , NULL, NULL,");
            sb.append(noStart + i);
            sb.append(");");
            sb.append("\n");
            index += 2;
        }

        return sb.toString();
    }

//    public static void main(String[] args) {
//        int startEleId = 14049;
//        String eleNames = "认购下限金额\n" +
//                "权益类/商品及金融衍生品类标的投资比例是否可以超80%\n" +
//                "投资比例\n" +
//                "投资范围\n" +
//                "封闭期_其他\n" +
//                "收益分配频率\n" +
//                "收益分配频率_其他";
//        String templateId = "11";
//        String sql = create157Element(startEleId , eleNames , templateId);
//        System.out.println(sql);
//    }

    /**
     *
     * @param start 开始的场景id
     * @param eleNames  要素名称
     * @param templateId    场景id
     * @return
     *
     **/
    private static String create157Element(int start , String eleNames , String templateId){
        String s = "";
        String[] eleNameArray = eleNames.split("\n");
        StringBuilder sb = new StringBuilder();
        int j = 0;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(new Date());

        for(int i = start ; i < start + eleNameArray.length ; i++){
            sb.append("INSERT INTO `element`(`ele_sn`, `parent_ele_sn`, `map_name`, `template_sn`, `ele_name`, `ele_type`, `ele_category_ch`, `counted`, `needs_json`, `package_sn`, `selected`, `is_del`, `created_time`, `updated_time`) VALUES (");
            sb.append(i);
            sb.append(", 0, '', '");
            sb.append(templateId);
            sb.append("', '");
            sb.append(eleNameArray[j]);
            sb.append("', '多项', '字符串', 1, 1, '55', 1, 0,'");
            sb.append(time);
            sb.append("', NULL);\n");
            j++;
        }

        return sb.toString();
    }

}
